package com.wakaca.design.pattern.creational.singleton;

import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 容器单例类
 * 这种单例模式存在一定的隐患，需要根据实际的业务场景
 * Created by wakava
 */
public class ContainerSingleton {

    private ContainerSingleton(){

    }

    /**
     * 如果这里使用 HashTable，那他就是线程安全的，但是会影响性能，不建议使用 HashTable
     * 如果使用 ConcurrentHashMap，但是我们使用的是静态的 ConcurrentHashMap，而且直接操作了这个Map
     * 在这种场景下 ConcurrentHashMap 并不是绝对的线程安全，在考虑反射和序列化这种机制的话，这种
     * 容器单例模式也是有一定适应场景的
     *
     * ConcurrentHashMap是线程安全的，那是他们的内部操作，其外部操作还是需要自己来保证同步，
     * 特别是静态的ConcurrentHashMap,其有更新和查询的过程，要保证其线程安全，需要同步代码块才能保证其原子性
     */
    private static Map<String,Object> singletonMap = new HashMap<String,Object>();

    public static void putInstance(String key,Object instance){
        if(StringUtils.isNotBlank(key) && instance != null){
            if(!singletonMap.containsKey(key)){
                singletonMap.put(key,instance);
            }
        }
    }

    public static Object getInstance(String key){
        return singletonMap.get(key);
    }

}
